/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CTRL;

import Model.Grille;
import View.Vue;
import java.io.IOException;
import java.util.Scanner;

/**
 *
 * @author Karen & Renaud & François
 */
public class playLogin {

    Scanner lecture;
    Vue vue;
    Protocol connector;
    String choix, user, pass;    //  inputreader
    Grille grille;

    public playLogin(Vue vue, Protocol connector) {
        this.vue = vue;
        this.connector = connector;
        lecture = new Scanner(System.in);
        user = "";
    }

    public void begin() throws IOException { // debut Log In/ new user / exit
        vue.connectMenu();

        choix = "3";   //  :)
        while (choix.charAt(0) != '1' && choix.charAt(0) != '2' && choix.charAt(0) != 'q') {

            choix = lecture.next();
        }

        switch (choix.charAt(0)) {
            case '1':
                newUser();
                break;       //  new user
            case '2':
                login();
                break;         //  log in
            case 'q':
                exit();
                break;          //  EXIT
            default:
                break;

        }

    }

    private void login() throws IOException {
        vue.userLogin();
        user = lecture.nextLine();  // ou nextline???
        while ("".equals(user)) {
            user = lecture.nextLine();
        }
        vue.userPass();
        pass = lecture.nextLine();

        if (connector.logIn(user, pass) == false) { // user n'existe pas ou mdp erroné
            vue.userError2();
            begin(); // on re propose le menu de debut,  à voir s'il faut pas ajouter un choix - relog in ou new user
        } else {
            vue.userOK();
            choixType();   //    
        }
    }

    private void newUser() throws IOException {
        vue.userNew();
        user = lecture.nextLine();  // ou nextline???
        while ("".equals(user)) {
            user = lecture.nextLine();
        }

        vue.userPass();
        pass = lecture.nextLine();
        // envoi du nom au serveur pour la verif s'il n'existe pas
        if (connector.newUser(user, pass) == false) {
            vue.userError1();
        }

        begin();

    }

    private void choixType() throws IOException {  // debut de configs

        // il faut un msg pour choix type

        vue.configMenu();
        choix = " ";   //  :)
        while (choix.charAt(0) != '1' && choix.charAt(0) != '2' && choix.charAt(0) != '3'
                && choix.charAt(0) != 'l' && choix.charAt(0) != 's'
                && choix.charAt(0) != 'q') {

            choix = lecture.next();
        }

        switch (choix.charAt(0)) {
            case '1':
                configType(1);
                break;         //  config beginer
            case '2':
                configType(2);
                break;         //  config normal
            case '3':
                configType(3);
                break;         //  config pro
            case 'l':
                logOut();
                break;              // logout pour se connecter sous un autre nom
            case 's':
                stats(user);
                break;           // voir les stats
            case 'q':
                exit();
                break;                //  Exit 
            default:
                break;

        }

    }

    private void configType(int i) throws IOException {  // il faut factoriser configuration + configType
        if (i == 1) {
            grille = vue.configType(4);
        } else if (i == 2) {
            grille = vue.configType(6);
        } else if (i == 3) {
            grille = vue.configType(8);
        }

        creationPartieSurServer();
    }

    private void creationPartieSurServer() throws IOException {  // creation de la partie sur serveur 
        // on envoie tous ces parametres pour créér une combinaison (partie sur serveur) mais aussi
        // pour le calcule des points....
        // à la fin de la partie on envoie le numero de la tentative, ou à chauqe verification.
        connector.createPartie(user, grille.getNbColons(), grille.getNbColors(), grille.getNbTent());

        play();  // on commance à jouer
    }

    private void play() throws IOException {  // tout se passe ici.


        String msg;         // msg bonne recption d'un encodage 
        String[] pionsWin = null;    //  Pions => [0] les noirs[1] blancs| [2]=> Win  [3]= score
        boolean exit = false;
        boolean restart = false;  // on peut regrouper exit et restart...
        boolean win = false;

        while (grille.numTour < grille.get_plateau().length && win == false && exit == false && restart == false) {

            vue.msgEnterCombi(grille.numTour + 1);    // print msg num Tour plus entrer votre combi

            //---------- propostion de combinaison    
            msg = lectureCombi();  // on recoit ok si tout va bien, si non reset ou exit


            if (msg.equals("restart") == true) {  // on recommance la même partie
                restart = true;           // faut voir s'il nous faut encore cette variable
                grille.numTour = 0; // reset compteur de tours
                play();
            }

            if (msg.equals("exit") == true) {
                exit = true;
                choixType();  // message de sortie

            } else { //si tout va bien
                // ---- envoie de combi pour la verification
                grille.placerCombinaison();  // placer la combinaisson  dans le plateau pour afficher l'historique

                pionsWin = connector.sendCombi(user, grille.get_combi(), grille.numTour);  // envoie la combipour la verif & recoit String [] (0 pion noir, 1 pion blanc, 2 win ou pas

                grille.placerPions(Integer.valueOf(pionsWin[0]), Integer.valueOf(pionsWin[1]));

                if (pionsWin[2].equals("true") == true) {
                    win = true;
                }

                // --- incrementation +  affichage de grille 
                grille.numTour++;
                System.out.println('\n');
                vue.printGrille(grille);
                System.out.println("");
            }
        }
        if (win == true) {
            vue.msgWin(grille.numTour, Integer.valueOf(pionsWin[3]));
            choixType();

        }
        // si num tout actuel ==  num tour max  perdu
        if (grille.numTour == grille.getNbTent()) {
            vue.msgFail();
            choixType();
        }
    }

    // ------------- Stats
    private void exit() {
        vue.msgExit();
    }

    private void logOut() throws IOException {
        vue.userLogOut(user);
        user = " ";
        pass = " ";
        begin();
    }

    private void stats(String userName) throws IOException {
        // demande de stast pour user.
        String[] stat = connector.getStats(userName);
        //affchage d'info
        vue.printStats(userName, stat);

        // stats pour config 1
        stat = connector.getStats(1);
        vue.printStats(stat, 1);

        // stats pour config 2
        stat = connector.getStats(2);
        vue.printStats(stat, 2);

        // stats pour config 3
        stat = connector.getStats(3);
        vue.printStats(stat, 3);

        // on revien au menu precedent
        choixType();

    }

    private String lectureCombi() {
        String out = "NOK";
        String toSplit = "";


        while ((out.equals("OK") == false) && (out.equals("exit") == false) && (out.equals("restart") == false)) {
            // verif s'il n'ya pas un "q" => quiter
            vue.printColors(grille.getNbColors());  // affiche les couelurs dispo
            toSplit = lecture.nextLine();
            while ("".equals(toSplit)) {
                toSplit = lecture.nextLine();
            }
            String[] combi = toSplit.split(" ");

            if (combi[0].equals("q") == true) {
                out = "exit";
                break;
            }
            else if (combi[0].equals("r") == true) {
                out = "restart";
                break;
            }

            else if (combi.length == grille.getNbColons()) { // so on a bien  le nombre d'element qui = aux nombre de colones

                for (int i = 0; i < grille.getNbColons(); i++) {

                    if (combi[i].length() == 1) {  // verifier bien qu'il n'ya qu'1 seul CHAR

                        if ((Character.digit(combi[i].charAt(0), 10) <= grille.getNbColors())
                                && (Character.digit(combi[i].charAt(0), 10) > 0)) { // verif si c'est bien un chifre entre 0 et nbcouleurs
                            grille.choisirBille(i, combi[i].charAt(0));
                          //  System.out.println("+"+grille.getNbColors());
                            out = "OK";
                            //System.out.println("out "+out);
                        } else { // c'est pas une bonne couleure
                            out = "WRONGCHAR";
                           // System.out.println("out "+out);
                            break;
                        }
                    } else { // il ya un plus d'un char  on recommance 
                        out = "PLUS1CHAR";
                        //System.out.println("out "+out);
                        break;
                    }
                } // end for
            }
           //  System.out.println("out end"+out);
        }

        //  grille.printCombi();
        return out;
    }
}// end class
